保護 JavaScript 原始碼


應用程式的 JavaScript 原始碼可以透過編譯成原生程式碼並由 NW.js 載入來保護。您只需要在生產環境中將已編譯的程式碼與應用程式一起發佈即可。

編譯

JS 原始碼會使用 SDK 建置中提供的工具 nwjc 編譯成原生程式碼。

使用方式

nwjc source.js binary.bin

*.bin 檔案需要與您的應用程式一同散佈。您可以隨意命名。

如果您正在編譯模組,則需要 --nw-module 引數。

載入已編譯的 JavaScript

nw.Window.get().evalNWBin(frame, 'binary.bin');

win.evalNWBin() 方法的引數與 Window.eval() 方法類似,其中第一個參數為目標 iframe(主框架為 null),第二個參數為二進位碼檔案。

如果您正在為模組載入二進位碼,則應改用 win.evalNWBinModule()

從遠端載入已編譯的 JavaScript

已編譯的 JavaScript 可以從遠端擷取(例如透過 AJAX),並即時執行。

var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer'; // make response as ArrayBuffer
xhr.open('GET', url, true);
xhr.send();
xhr.onload = () => {
  // xhr.response contains compiled JavaScript as ArrayBuffer
  nw.Window.get().evalNWBin(null, xhr.response);
}

注意

已編譯的程式碼會在 瀏覽器內容 中執行。您可以使用任何 Web API(例如 DOM)和 存取瀏覽器內容中執行的 NW.js API 和 Node API

在 Web Workers 中使用

工作人員內容中引入了函式 importNWBin(ArrayBuffer)。二進位碼檔案可以在主執行緒中讀取為陣列緩衝區,傳送到工作人員,然後使用新函式在那裡執行。

已知問題

在 0.22 之前,已編譯的程式碼執行速度比一般 JS 慢:根據 v8bench,效能約為 30%。其他未編譯的 JS 原始碼不會受到影響。在 0.22.0-beta1 中,此問題已獲得修復。請查看我們的部落格文章:https://nwjs.io/blog/js-src-protect-perf/

已編譯的程式碼無法跨平台,也不相容於 NW.js 的不同版本。因此,當您封裝應用程式時,需要為每個平台執行 nwjc